package com.jhz.speedy.common.base;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import butterknife.ButterKnife;

/**
 * Fragment 基类
 * 可用于懒加载，也可普通通用
 *
 * Created by 均合 on 2017/1/22.
 */
public abstract class IBaseFragment extends Fragment{
    public final String TAG = getClass().getSimpleName();
    private boolean isPrepared; // 是否已准备好视图
    protected View mMainView;   // 主视图
    private boolean isLazy = true; // 是否懒加载

    /**
     * 每次显示视图
     */
    protected abstract void onShowView();

    /**
     * 首次初始化视图
     */
    protected abstract void initView();

    /**
     * 初始化布局id
     * @return 布局id
     */
    protected abstract int getLayoutId();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // 不是懒加载，或者view被回收
        if(! isLazy || mMainView == null){
            // 初始化主视图
//            LogUtils.i(TAG, "initView");
            mMainView = inflater.inflate(getLayoutId() , container , false);
            ButterKnife.bind(this, mMainView);   // 绑定Fragment
            initView();
            // 标记视图已准备，并且检测可见性
            isPrepared = true;
            checkIsPreparedAndVisible(getUserVisibleHint());
        }
        return mMainView;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        // 检查可见，且视图已准备，则更新数据
        checkIsPreparedAndVisible(isVisibleToUser);
    }

    /**
     * 检查可见，且视图已准备，则更新数据
     * setUserVisibleHint 在 onCreateView 前被调用。
     * 而更新数据，必须onCreateView 且可见状态才可激活
     *
     * @param isVisible
     */
    private void checkIsPreparedAndVisible(boolean isVisible){
        if(isVisible && isPrepared){
            // Fragment可见，并且视图已创建
//            LogUtils.i(TAG, "onShowView");
            onShowView();
        }
    }


}
